home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et3_0-a1.lha / et3 / src / ClassManager.C < prev    next >
C/C++ Source or Header  |  1992-07-10  |  3KB  |  151 lines

  1. #ifdef __GNUG__
  2. #pragma implementation
  3. #endif
  4.  
  5. #include "ClassManager.h"
  6.  
  7. #include "Class.h"
  8. #include "String.h"
  9. #include "OrdColl.h"
  10. #include "SortedOList.h"
  11. #include "ObjectTable.h"
  12. #include "System.h"
  13.  
  14. ClassManager *gClassManager;
  15.  
  16. //---- ClassManager ------------------------------------------------------------
  17.  
  18. NewMetaImpl(ClassManager,Object, (TP(classTable), TB(sorted)));
  19.  
  20. ClassManager::ClassManager()
  21. {
  22.     classTable= 0;
  23.     sorted= FALSE;
  24. }
  25.  
  26. ClassManager::~ClassManager()
  27. {
  28.     SafeDelete(classTable);
  29. }
  30.  
  31. //---- class table management --------------------------------------------------
  32.  
  33. OrdCollection *ClassManager::sortClassTable()
  34. {
  35.     classTable->Sort();
  36.     sorted= TRUE;
  37.     return classTable;
  38. }
  39.  
  40. void ClassManager::Add(Class *cl)
  41. {
  42.     if (classTable == 0)
  43.     classTable= new OrdCollection(300);
  44.     if (classTable->FindPtr(cl) == 0)
  45.     classTable->Add(cl);
  46.     sorted= FALSE;
  47.     //Send(cIdNone, 8888, cl);
  48. }
  49.  
  50. void ClassManager::Remove(Class *cl)
  51. {
  52.     if (classTable)
  53.     classTable->RemovePtr(cl);
  54. }
  55.  
  56. Class *ClassManager::Find(char *name, char *version)
  57. {
  58.     Class lookFor(name, version);  
  59.     int at= GetClassTable()->BinarySearch(&lookFor);
  60.     if (at != -1)
  61.     return (Class*) GetClassTable()->At(at);
  62.     return 0;
  63. }
  64.  
  65. Class *ClassManager::FindOrLoad(char *name, char *version)
  66. {
  67.     Class *clp= Find(name, version);
  68.     if (clp == 0) {
  69.     gSystem->Load(name, 0);
  70.     clp= Find(name, version);
  71.     if (clp == 0)
  72.         Error("FindOrLoad", "cannot load class %s", name);
  73.     }
  74.     return clp;
  75. }
  76.  
  77. Object *ClassManager::Load(char *module, char *cla)
  78. {
  79.     Class *cl;
  80.     
  81.     cl= gClassManager->Find(cla);
  82.     if (cl == 0)
  83.     gSystem->Load(module, 0);
  84.     cl= gClassManager->Find(cla);
  85.     if (cl == 0) {
  86.     fprintf(stderr, "can't find class %s\n", cla);
  87.     return 0;
  88.     }
  89.     return cl->Proto()->New();
  90. }
  91.  
  92. void ClassManager::SetupSubclasses()
  93. {
  94.     OrdCollectionIter next(GetClassTable());
  95.     register Class *clp, *super;
  96.  
  97.     while (clp= (Class*) next()) 
  98.     if (clp->SubClasses()) 
  99.         clp->SubClasses()->Empty();
  100.  
  101.     next.Reset();
  102.     while (clp= (Class*) next()) 
  103.     if (super= clp->Super())
  104.         super->AddSubclass(clp);
  105. }
  106.  
  107. //---- sort list according to number of instances of a class -------------------
  108.  
  109. class CumSortedObjList : public SortedObjList {
  110. public:
  111.     CumSortedObjList()
  112.     { }
  113.     int CompareObjects(Object*, Object*);
  114. };
  115.     
  116. int CumSortedObjList::CompareObjects(Object *op1, Object *op2)
  117. {
  118.     return Guard(op2, Class)->GetInstanceCount() - Guard(op1, Class)->GetInstanceCount();
  119. }
  120.  
  121. void ClassManager::InstanceStatistics(bool cumsorted)
  122. {
  123.     Class *clp;
  124.     int cum= 0;
  125.     Collection *col, *csl= 0;
  126.     
  127.     ObjectTable::UpdateInstCount(TRUE);
  128.     if (cumsorted) {
  129.     col= csl= new CumSortedObjList;
  130.     csl->AddAll(classTable);
  131.     } else
  132.     col= GetClassTable();
  133.     Iter next(col);
  134.  
  135.     fprintf(stderr, "Instances per class on heap\n");
  136.     fprintf(stderr, "=============================\n");
  137.     while (clp= (Class*) next()) {
  138.     if (clp->GetInstanceCount() > 0) {
  139.         fprintf(stderr, "%-20s%8d%8d\n", clp->Name(),
  140.                     clp->GetInstanceCount(), clp->Size());
  141.         cum+= clp->GetInstanceCount();
  142.     }
  143.     }
  144.     fprintf(stderr, "-----------------------------\n");
  145.     fprintf(stderr, "Total %d\n", cum);
  146.     fprintf(stderr, "=============================\n");
  147.     
  148.     SafeDelete(csl);
  149. }
  150.  
  151.